package tools;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import javax.imageio.ImageIO;

/**
 * Klasse, die es ermoeglicht BufferedImages durch Serialisierung zu speichern
 */
public class SerializableBufferedImage implements Serializable {

    private byte[] byteImage = null;

    /**
     * byteImage mit bufferedImage als eine byte[] setzen
     * @param bufferedImage
     */
    public SerializableBufferedImage(BufferedImage bufferedImage) {
        this.byteImage = toByteArray(bufferedImage);
    }

    /**
     * aus byteImage, das ein byte[] ist, wird in ein BufferedImage konvertiert
     * @return BufferedImage
     */
    public BufferedImage getBufferedImage() throws Exception {
            return fromByteArray(byteImage);
    }

    /**
     * aus den eingegebenen imagebytes wird ein BufferedImage erzeugt
     * @param imagebytes
     * @return BufferedImage
     */
    private BufferedImage fromByteArray(byte[] imagebytes) throws Exception {
        try {
            if (imagebytes != null && (imagebytes.length > 0)) {
                BufferedImage im = ImageIO.read(new ByteArrayInputStream(imagebytes));
                return im;
            }
            return null;
        } catch (Exception ex) {
            throw ex;
        }
    }

    /**
     * Es wird ein byte[] erzeugt von den eingegebenen bufferedImage
     * @param bufferedImage
     * @return byte[]
     */
    private byte[] toByteArray(BufferedImage bufferedImage) {
        if (bufferedImage != null) {
            BufferedImage image = bufferedImage;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            try {
                ImageIO.write(image, "png", baos);
            } catch (IOException e) {
                throw new IllegalStateException(e.toString());
            }
            byte[] b = baos.toByteArray();
            return b;
        }
        return new byte[0];
    }
}